package CargaJuego;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

import General.Constantes;
import Graficas.Audio;
import Graficas.InterfaceGrafica;
import Graficas.Sprite;
import Graficas.SpriteMovements;
import Graficas.SpriteMovementsPrioridad;
import Logica.ControlColisiones;
import Logica.Inteligencia;
import Logica.Mapa;
import Logica.MapaVisible;
import Logica.Mario;
import Logica.MatrizCelda;
import Logica.Puntuacion;
import Logica.Celdas.Celda;
import Logica.Enemigos.Enemigo;
import Logica.PowerUps.PUVacio;

/**
 * Es la clase encargada de cargar todos los elementos necesarios para comenzar el juego. Carga
 * desde archivo las imagenes, los sonidos, los niveles y los escenarios necesarios.
 * 
 * @author Mariano Rodecker
 * @author Matias Varela
 * 
 */
public class Cargador {

	/* ################## ATRIBUTOS DE INSTANCIA ######################## */
	protected MatrizCelda nivel;
	protected Image[][] escenario;
	protected MapeoCaracteresCeldas mapeoMapa;
	protected MapeoCaracteresEnemigos mapeoEnemigos;
	protected SpriteMovements aniMarioChico;
	protected SpriteMovements aniMarioGrande;
	protected SpriteMovements aniMarioGrandeFlor;
	protected SpriteMovements aniCajas;
	protected SpriteMovements aniLadrillos;
	protected SpriteMovements aniPisos;
	protected SpriteMovements aniLlegada;
	protected SpriteMovements aniVacio;
	protected SpriteMovements aniGoomba;
	protected SpriteMovements aniKoopa;
	protected SpriteMovements aniMonkey;
	protected SpriteMovements aniHongoRojo;
	protected SpriteMovements aniHongoVerde;
	protected SpriteMovements aniBombaNuclear;
	protected SpriteMovements aniEstrella;
	protected SpriteMovementsPrioridad aniMonedas;
	protected SpriteMovements aniFlorFuego;
	protected SpriteMovements aniProyectil;

	protected Mario mario;
	protected Queue<Enemigo> enemigos;
	protected Mapa mapa;
	protected MapaVisible mapaV;

	protected Audio Soundtrack, Soundtrack_GameOver;
	protected InterfaceGrafica ig;
	protected Inteligencia intel;

	public Cargador(InterfaceGrafica ig) {
		this.ig = ig;
	}

	/* ################## COMANDOS ######################## */

	/**
	 * Carga el nivel pasado por parametro. Luego inicializa los atributos de instancia de la clase.
	 * 
	 * @param n
	 *            - es el nivel a cargar.
	 */
	public void cargarNivel(int n) {
		// Obtiene el archivo con los datos para el nivel n.
		try {
			/*
			 * Leo linea a linea el archivo DatosNivel, y obtengo los datos necesarios.
			 */
			InputStream is = getClass().getResourceAsStream("/FilesJuego/DatosNiveles/DatosNivel" + n + ".txt");
			BufferedReader in = new BufferedReader(new InputStreamReader(is));

			int filasMatriz = Integer.parseInt(in.readLine());
			int columnasMatriz = Integer.parseInt(in.readLine());
			String nameImgEscenario = in.readLine();
			String nameImgCeldas = in.readLine();
			String nameImgMario = in.readLine();
			String nameImgMarioGrande = in.readLine();
			String nameImgMarioGrandeFlor = in.readLine();
			String nameNivel = in.readLine();
			String nameEscenario = in.readLine();
			String nameEnemigos = in.readLine();
			String nameImgGoomba = in.readLine();
			String nameImgKoopa = in.readLine();
			String nameImgMonkey = in.readLine();
			String nameImgPowerUps = in.readLine();
			String nameImgMonedas = in.readLine();
			String nameImgProyectil = in.readLine();
			String nameSoundtrack = in.readLine();
			String nameSoundtrack_GameOver = in.readLine();

			// Cargo los sonidos
			Soundtrack = new Audio(nameSoundtrack);
			Soundtrack_GameOver = new Audio(nameSoundtrack_GameOver);

			// cargo los spriteMovements de las celdas y el mario
			cargarSpriteMovementsCeldas(nameImgCeldas);
			cargarSpriteMovementsMarioChico(nameImgMario);
			cargarSpriteMovementsMarioGrande(nameImgMarioGrande);
			cargarSpriteMovementsMarioGrandeFlor(nameImgMarioGrandeFlor);
			cargarSpriteMovementsGoomba(nameImgGoomba);
			cargarSpriteMovementsKoopa(nameImgKoopa);
			cargarSpriteMovementsMonkey(nameImgMonkey);
			cargarSpriteMovementsPowerUps(nameImgPowerUps);
			cargarSpriteMovementsMonedas(nameImgMonedas);
			cargarSpriteMovementsProyectil(nameImgProyectil);

			this.intel = new Inteligencia();
			intel.setPuntuacion(new Puntuacion());

			// cargo la matriz de celdas del nivel.
			nivel = cargarMatrizNivel(filasMatriz, columnasMatriz, nameNivel);

			// cargo la matriz de imagenes correspondientes al escenario.
			escenario = cargarEscenario(filasMatriz, columnasMatriz, nameEscenario, nameImgEscenario);

			// cargo la cola de enemigos
			enemigos = cargarEnemigos(nameEnemigos, filasMatriz, columnasMatriz);

			// creo el mapa la inteligencia y el control de colisiones
			mapa = new Mapa(nivel, enemigos);
			mapaV = new MapaVisible(mapa, 0, Constantes.width_MapaVisible);
			ControlColisiones cCol = new ControlColisiones(mapaV);
			intel.setControlColisiones(cCol);

			// Creo al mario y lo ubico en el mapa
			PUVacio p = new PUVacio(0, 0, null, null);
			p.setInteligencia(intel);
			mario = new Mario(Constantes.sizeMarioChicoX, Constantes.sizeMarioChicoY, 1, getAniMario(), aniMarioGrande, aniMarioGrandeFlor, ig, p);
			mario.setX(Constantes.sizeMarioChicoX * 2);
			mario.setY(8 * Constantes.sizeMarioChicoY);
			mario.setDirActual(Constantes.dir_nada_right);

			// seteo la inteligencia a todos los objetos
			mario.setInteligencia(intel);

			mapaV.setMario(mario);

		} catch (FileNotFoundException e) {
		} catch (NumberFormatException e) {
		} catch (IOException e) {
		}
	}

	/* ################## CONSULTAS ######################## */

	public Inteligencia getIntel() {
		return intel;
	}

	public Mapa getMapa() {
		return mapa;
	}

	public MapaVisible getMapaVisible() {
		return mapaV;
	}

	public Queue<Enemigo> getColaEnemigos() {
		return enemigos;
	}

	/**
	 * Retorna el mario cargado.
	 * 
	 * @return mario cargado.
	 */
	public Mario getMario() {
		return mario;
	}

	/**
	 * Retorna la interface grafica asociada al cargador
	 * 
	 * @return
	 */
	public InterfaceGrafica getIg() {
		return ig;
	}

	/**
	 * Retorna el nivel cargado.
	 * 
	 * @return el nivel cargado.
	 */
	public MatrizCelda getNivel() {
		return nivel;
	}

	public SpriteMovements getAniFlorFuego() {
		return aniFlorFuego;
	}

	public SpriteMovements getAniProyectil() {
		return aniProyectil;
	}

	public SpriteMovementsPrioridad getAniMonedas() {
		return aniMonedas;
	}

	public SpriteMovements getAniEstrella() {
		return this.aniEstrella;
	}

	public SpriteMovements getAniBombaNuclear() {
		return this.aniBombaNuclear;
	}

	public SpriteMovements getAniHongoVerde() {
		return this.aniHongoVerde;
	}

	public SpriteMovements getAniHongoRojo() {
		return this.aniHongoRojo;
	}

	public SpriteMovements getAniMonkey() {
		return this.aniMonkey;
	}

	public SpriteMovements getAniKoopa() {
		return aniKoopa;
	}

	public SpriteMovements getAniGoomba() {
		return aniGoomba;
	}

	/**
	 * Retorna el SpriteMovements de Mario. Se asume que previamente se cargo un nivel.
	 * 
	 * @return el SpriteMovements de Mario.
	 */
	public SpriteMovements getAniMario() {
		return aniMarioChico;
	}

	/**
	 * Retorna el SpriteMovements de una Caja. Se asume que previamente se cargo un nivel.
	 * 
	 * @return el SpriteMovements de una Caja.
	 */
	public SpriteMovements getAniCajas() {
		return aniCajas;
	}

	/**
	 * Retorna el SpriteMovements de un Ladrillo. Se asume que previamente se cargo un nivel.
	 * 
	 * @return el SpriteMovements de un Ladrillo.
	 */
	public SpriteMovements getAniLadrillos() {
		return aniLadrillos;
	}

	/**
	 * Retorna el SpriteMovements de un Piso. Se asume que previamente se cargo un nivel.
	 * 
	 * @return el SpriteMovements de un Piso.
	 */
	public SpriteMovements getAniPisos() {
		return aniPisos;
	}

	/**
	 * Retorna el SpriteMovements de una celda de Llegada. Se asume que previamente se cargo un
	 * nivel.
	 * 
	 * @return el SpriteMovements de una celda de Llegada.
	 */
	public SpriteMovements getAniLlegada() {
		return aniLlegada;
	}

	/**
	 * Retorna el SpriteMovements de una celda Vacia. Se asume que previamente se cargo un nivel.
	 * 
	 * @return el SpriteMovements de una celda Vacia
	 */
	public SpriteMovements getAniVacio() {
		return aniVacio;
	}

	/**
	 * Retorna una matriz de imagenes, que contiene las imagenes que representa al Escenario
	 * 
	 * @return una matriz de imagenes, que contiene las imagenes que representa al Escenario
	 */
	public Image[][] getEscenario() {
		return escenario;
	}

	/**
	 * Retorna el sonido de fondo del nivel, previamente cargado.
	 * 
	 * @return el sonido de fondo del nivel, previamente cargado.
	 */
	public Audio getSoundtrack() {
		return Soundtrack;
	}

	/**
	 * Retorna el sonido de Game Over del nivel previamente cargado
	 * 
	 * @return el sonido de Game Over del nivel previamente cargado
	 */
	public Audio getSoundtrack_GameOver() {
		return Soundtrack_GameOver;
	}

	/* ################## METODOS PRIVADOS DE LA CLASE ######################## */

	/*
	 * Carga la mariz de celdas que representa al escenario.
	 */
	private Image[][] cargarEscenario(int filasE, int columnasE, String nameE, String nameImgE) {
		try {
			/*
			 * Obtengo la imagen del escenario y luego la subdivido en partes, y cada una de las
			 * subImage los coloco en un arreglo.
			 */
			Image[] imagenes = new Image[15];
			BufferedImage imEscenario = ImageIO.read(getClass().getResourceAsStream(nameImgE));
			imagenes[0] = imEscenario.getSubimage(0, 0, Constantes.sizeCelda, Constantes.sizeCelda);
			imagenes[1] = imEscenario.getSubimage(1 * Constantes.sizeCelda, 0, Constantes.sizeCelda, Constantes.sizeCelda);
			imagenes[2] = imEscenario.getSubimage(2 * Constantes.sizeCelda, 0, Constantes.sizeCelda, Constantes.sizeCelda);
			imagenes[3] = imEscenario.getSubimage(0, 1 * Constantes.sizeCelda, Constantes.sizeCelda, Constantes.sizeCelda);
			imagenes[4] = imEscenario.getSubimage(1 * Constantes.sizeCelda, 1 * Constantes.sizeCelda, Constantes.sizeCelda, Constantes.sizeCelda);
			imagenes[5] = imEscenario.getSubimage(2 * Constantes.sizeCelda, 1 * Constantes.sizeCelda, Constantes.sizeCelda, Constantes.sizeCelda);
			imagenes[6] = imEscenario.getSubimage(0, 2 * Constantes.sizeCelda, Constantes.sizeCelda, Constantes.sizeCelda);
			imagenes[7] = imEscenario.getSubimage(1 * Constantes.sizeCelda, 2 * Constantes.sizeCelda, Constantes.sizeCelda, Constantes.sizeCelda);
			imagenes[8] = imEscenario.getSubimage(2 * Constantes.sizeCelda, 2 * Constantes.sizeCelda, Constantes.sizeCelda, Constantes.sizeCelda);
			imagenes[9] = imEscenario.getSubimage(0, 3 * Constantes.sizeCelda, Constantes.sizeCelda, Constantes.sizeCelda);
			imagenes[10] = imEscenario.getSubimage(1 * Constantes.sizeCelda, 3 * Constantes.sizeCelda, Constantes.sizeCelda, Constantes.sizeCelda);
			imagenes[11] = imEscenario.getSubimage(2 * Constantes.sizeCelda, 3 * Constantes.sizeCelda, Constantes.sizeCelda, Constantes.sizeCelda);
			imagenes[12] = imEscenario.getSubimage(0, 4 * Constantes.sizeCelda, Constantes.sizeCelda, Constantes.sizeCelda);
			imagenes[13] = imEscenario.getSubimage(1 * Constantes.sizeCelda, 4 * Constantes.sizeCelda, Constantes.sizeCelda, Constantes.sizeCelda);
			imagenes[14] = imEscenario.getSubimage(2 * Constantes.sizeCelda, 4 * Constantes.sizeCelda, Constantes.sizeCelda, Constantes.sizeCelda);

			/*
			 * creo el mapeo de caracteres para el escenario, utilizando las imagenes sub divididas
			 */
			MapeoCaracteresEscenario mapeoEscenario = new MapeoCaracteresEscenario(imagenes);

			/*
			 * cargo la matriz del escenario y luego la retorno.
			 */
			return cargarMatrizEscenario(filasE, columnasE, nameE, mapeoEscenario);

		} catch (IOException e) {
		}
		return null;
	}

	/*
	 * A partir de un archivo txt, cargo el nivel el cual es una matriz de caracteres que luego son
	 * mapeadas con celdas (ladrillos, cajas, piso, etc)
	 */
	private MatrizCelda cargarMatrizNivel(int f, int c, String name) {
		nivel = new MatrizCelda(f, c);
		mapeoMapa = new MapeoCaracteresCeldas(this);
		mapearCaracteresN(name);
		return nivel;
	}

	/*
	 * A partir de un archivo txt, cargo el escenario el cual es una matriz de caracteres que luego
	 * son mapeadas con imagenes.
	 */
	private Image[][] cargarMatrizEscenario(int f, int c, String name, MapeoCaracteresEscenario mapeoE) {
		Image[][] matrizE = new Image[f][c];
		mapearCaracteresE(name, mapeoE, matrizE);

		return matrizE;
	}

	/* realizo el mapeo de caracteres para el escenario */
	private void mapearCaracteresE(String ruta, MapeoCaracteresEscenario mapeoE, Image[][] matrizE) {
		int linea = 0;

		try {
			InputStream is = getClass().getResourceAsStream(ruta);
			BufferedReader in = new BufferedReader(new InputStreamReader(is));
			String letras;
			while ((letras = in.readLine()) != null) {
				this.convertirLineasE(linea, letras, mapeoE, matrizE);
				linea++;
			}
		} catch (FileNotFoundException e) {
		} catch (IOException e) {
		}
	}

	/* convierto cada linea y creo la matriz de imagenes para el escenario */
	private void convertirLineasE(int linea, String letras, MapeoCaracteresEscenario mapeoE, Image[][] matrizE) {
		for (int i = 0; i < letras.length(); i++) {
			Character c = new Character(letras.charAt(i));
			matrizE[linea][i] = mapeoE.getImage(c);
		}
	}

	// ///////////////////////////////////////////////////////
	// ///////////////////////////////////////////////////////
	private Queue<Enemigo> cargarEnemigos(String nameEnemigos, int filas, int columnas) {
		mapeoEnemigos = new MapeoCaracteresEnemigos(this);
		Queue<Enemigo> cola = new LinkedBlockingQueue<Enemigo>();
		mapearCaracteresEnemigos(nameEnemigos, cola, filas, columnas);
		return cola;
	}

	private void mapearCaracteresEnemigos(String nameEnemigos, Queue<Enemigo> cola, int filas, int columnas) {
		int linea = 0;
		try {
			InputStream is = getClass().getResourceAsStream(nameEnemigos);
			BufferedReader in = new BufferedReader(new InputStreamReader(is));
			char[][] matrizAuxiliar = new char[filas][columnas];
			String letras;
			/* creo la matriz de caracteres auxiliar */
			while ((letras = in.readLine()) != null) {
				for (int i = 0; i < letras.length(); i++) {
					matrizAuxiliar[linea][i] = letras.charAt(i);
				}
				// this.convertirLineasEnemigos(linea, letras, cola);
				linea++;
			}

			/* a partir de la matriz auxiliar cargo los enemigos */
			for (int j = 0; j < matrizAuxiliar[0].length; j++) {
				for (int i = 0; i < matrizAuxiliar.length; i++) {
					Character e = new Character(matrizAuxiliar[i][j]);

					Enemigo enemigo = mapeoEnemigos.getEnemigo(e);
					Enemigo aInsertar;
					if (enemigo != null) {
						aInsertar = enemigo.clone();
						aInsertar.setX(j * Constantes.sizeCelda);
						aInsertar.setY(i * Constantes.sizeCelda);
						aInsertar.setY(aInsertar.getY() - (aInsertar.getSizeY() - Constantes.sizeCelda));
						aInsertar.setDirActual(Constantes.dir_left);
						cola.add(aInsertar);
					} else
						aInsertar = null;
				}
				System.out.println();
			}
		} catch (FileNotFoundException e) {
			System.out.println("ERROR");
		} catch (IOException e) {
			System.out.println("Error2");
		}

	}

	private void convertirLineasEnemigos(int linea, String letras, Queue<Enemigo> cola) {
		for (int i = 0; i < letras.length(); i++) {
			Character e = new Character(letras.charAt(i));
			Enemigo enemigo = mapeoEnemigos.getEnemigo(e);
			Enemigo aInsertar;
			if (enemigo != null) {
				aInsertar = enemigo.clone();
				aInsertar.setX(i * Constantes.sizeCelda);
				aInsertar.setY(linea * Constantes.sizeCelda);
				aInsertar.setY(aInsertar.getY() - (aInsertar.getSizeY() - Constantes.sizeCelda));
				aInsertar.setDirActual(Constantes.dir_left);
				cola.add(aInsertar);
			} else
				aInsertar = null;
		}

	}

	/* realizo el mapeo de caracteres para el nivel */
	private void mapearCaracteresN(String ruta) {
		int linea = 0;

		try {
			InputStream is = getClass().getResourceAsStream(ruta);
			BufferedReader in = new BufferedReader(new InputStreamReader(is));
			String letras;
			while ((letras = in.readLine()) != null) {
				this.convertirLineasN(linea, letras);
				linea++;
			}
		} catch (FileNotFoundException e) {
		} catch (IOException e) {
		}
	}

	/*
	 * convierto cada linea y a partir de esta creo las celdas y luego las voy insertando en la
	 * matriz de celdas del nivel
	 */
	private void convertirLineasN(int linea, String letras) {

		for (int i = 0; i < letras.length(); i++) {
			Character c = new Character(letras.charAt(i));
			Celda celda = mapeoMapa.getCelda(c);
			Celda aInsertar;
			if (celda != null) {
				aInsertar = celda.clone();
			} else
				aInsertar = null;
			nivel.setCelda(linea, i, aInsertar);
		}
	}

	/*
	 * cargo la imagen que contiene las imagenes de las celdas, y luego la subdivido para separarla
	 * y crear los spritemovements de las celdas
	 */
	private void cargarSpriteMovementsCeldas(String nameImgCeldas) {
		Sprite[] spritesCajas = new Sprite[4];
		Sprite[] spritesLadrillos = new Sprite[8];
		Sprite[] spritesPisos = new Sprite[1];
		Sprite[] spritesLlegada = new Sprite[1];

		int size = Constantes.sizeCelda;

		try {
			BufferedImage im = ImageIO.read(getClass().getResourceAsStream(nameImgCeldas));
			spritesPisos[0] = new Sprite((new ImageIcon(im.getSubimage(size, 0, size, size))).getImage());

			// move 0
			spritesLadrillos[0] = new Sprite((new ImageIcon(im.getSubimage(0, 0, size, size))).getImage());
			spritesLadrillos[1] = spritesLadrillos[0];
			spritesLadrillos[2] = spritesLadrillos[0];
			spritesLadrillos[3] = spritesLadrillos[0];
			// move 1
			spritesLadrillos[4] = new Sprite((new ImageIcon(im.getSubimage(0, size * 2, size, size))).getImage());
			spritesLadrillos[5] = new Sprite((new ImageIcon(im.getSubimage(size, size * 2, size, size))).getImage());
			spritesLadrillos[6] = new Sprite((new ImageIcon(im.getSubimage(size * 2, size * 2, size, size))).getImage());
			spritesLadrillos[7] = new Sprite((new ImageIcon(im.getSubimage(size * 3, size * 2, size, size))).getImage());

			spritesCajas[0] = new Sprite((new ImageIcon(im.getSubimage(0, size, size, size))).getImage());
			spritesCajas[1] = new Sprite((new ImageIcon(im.getSubimage(size * 1, size, size, size))).getImage());
			spritesCajas[2] = new Sprite((new ImageIcon(im.getSubimage(size * 2, size, size, size))).getImage());
			spritesCajas[3] = new Sprite((new ImageIcon(im.getSubimage(size * 3, size, size, size))).getImage());

			spritesLlegada[0] = new Sprite((new ImageIcon(im.getSubimage(size * 2, 0, size, size))).getImage());

		} catch (IOException e) {
		}

		aniCajas = new SpriteMovements(spritesCajas, 4, 1, 30);
		aniLadrillos = new SpriteMovementsPrioridad(spritesLadrillos, 4, 2, 0);
		aniPisos = new SpriteMovements(spritesPisos, 1, 1, 0);
		aniLlegada = new SpriteMovements(spritesLlegada, 1, 1, 0);

		Sprite[] spritesVacio = new Sprite[1];
		spritesVacio[0] = new Sprite(null);
		aniVacio = new SpriteMovements(spritesVacio, 1, 1, 0);
	}

	/* Carga desde archivo todos las imagenes del mario */
	private void cargarSpriteMovementsMarioChico(String nameImgMarioChico) {
		Sprite[] sprites = new Sprite[54];
		int sizeX = Constantes.sizeMarioChicoX;
		int sizeY = Constantes.sizeMarioChicoY;

		try {
			BufferedImage im = ImageIO.read(getClass().getResourceAsStream(nameImgMarioChico));

			// Saltar Izquierda Subida 0
			sprites[0] = new Sprite((new ImageIcon(im.getSubimage(0, 0, sizeX, sizeY))).getImage());
			sprites[1] = sprites[0];
			sprites[2] = sprites[0];
			sprites[3] = sprites[0];
			sprites[4] = sprites[0];
			sprites[5] = sprites[0];

			// Saltar Izquierda bajada 1
			sprites[6] = new Sprite((new ImageIcon(im.getSubimage(sizeX, 0, sizeX, sizeY))).getImage());
			sprites[7] = sprites[6];
			sprites[8] = sprites[6];
			sprites[9] = sprites[6];
			sprites[10] = sprites[6];
			sprites[11] = sprites[6];

			// Saltar Derecha subida 2

			sprites[12] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY, sizeX, sizeY))).getImage());
			sprites[13] = sprites[12];
			sprites[14] = sprites[12];
			sprites[15] = sprites[12];
			sprites[16] = sprites[12];
			sprites[17] = sprites[12];

			// Saltar Derecha bajada 3

			sprites[18] = new Sprite((new ImageIcon(im.getSubimage(sizeX, sizeY, sizeX, sizeY))).getImage());
			sprites[19] = sprites[18];
			sprites[20] = sprites[18];
			sprites[21] = sprites[18];
			sprites[22] = sprites[18];
			sprites[23] = sprites[18];

			// mover derecha 4
			sprites[24] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[25] = new Sprite((new ImageIcon(im.getSubimage(sizeX, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[26] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[27] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[28] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[29] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 5, sizeY * 2, sizeX, sizeY))).getImage());

			// mover Izquierda 5
			sprites[30] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[31] = new Sprite((new ImageIcon(im.getSubimage(sizeX, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[32] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[33] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[34] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[35] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 5, sizeY * 3, sizeX, sizeY))).getImage());

			// mover nada right 6
			sprites[36] = sprites[24];
			sprites[37] = sprites[24];
			sprites[38] = sprites[24];
			sprites[39] = sprites[24];
			sprites[40] = sprites[24];
			sprites[41] = sprites[24];

			// mover nada left 7
			sprites[42] = sprites[30];
			sprites[43] = sprites[30];
			sprites[44] = sprites[30];
			sprites[45] = sprites[30];
			sprites[46] = sprites[30];
			sprites[47] = sprites[30];

			// hacer caer 8
			sprites[48] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[49] = new Sprite((new ImageIcon(im.getSubimage(sizeX, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[50] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[51] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[52] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[53] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 5, sizeY * 4, sizeX, sizeY))).getImage());

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		/*
		 * los parametros indican que tiene 3 sprites por cada movimiento posible, tiene 5
		 * movimientos posibles y tiene un retardo de 10 entre cada cambio de sprite
		 */
		aniMarioChico = new SpriteMovementsPrioridad(sprites, 6, 7, 7);
	}

	/* Carga desde archivo todos las imagenes del mario */
	private void cargarSpriteMovementsMarioGrande(String nameImgMarioGrande) {
		Sprite[] sprites = new Sprite[54];
		int sizeX = Constantes.sizeMarioGrandeX;
		int sizeY = Constantes.sizeMarioGrandeY;

		try {
			BufferedImage im = ImageIO.read(getClass().getResourceAsStream(nameImgMarioGrande));

			// Saltar Izquierda Subida 0
			sprites[0] = new Sprite((new ImageIcon(im.getSubimage(0, 0, sizeX, sizeY))).getImage());
			sprites[1] = sprites[0];
			sprites[2] = sprites[0];
			sprites[3] = sprites[0];
			sprites[4] = sprites[0];
			sprites[5] = sprites[0];

			// Saltar Izquierda bajada 1
			sprites[6] = new Sprite((new ImageIcon(im.getSubimage(sizeX, 0, sizeX, sizeY))).getImage());
			sprites[7] = sprites[6];
			sprites[8] = sprites[6];
			sprites[9] = sprites[6];
			sprites[10] = sprites[6];
			sprites[11] = sprites[6];

			// Saltar Derecha subida 2

			sprites[12] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY, sizeX, sizeY))).getImage());
			sprites[13] = sprites[12];
			sprites[14] = sprites[12];
			sprites[15] = sprites[12];
			sprites[16] = sprites[12];
			sprites[17] = sprites[12];

			// Saltar Derecha bajada 3

			sprites[18] = new Sprite((new ImageIcon(im.getSubimage(sizeX, sizeY, sizeX, sizeY))).getImage());
			sprites[19] = sprites[18];
			sprites[20] = sprites[18];
			sprites[21] = sprites[18];
			sprites[22] = sprites[18];
			sprites[23] = sprites[18];

			// mover derecha 4
			sprites[24] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[25] = new Sprite((new ImageIcon(im.getSubimage(sizeX, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[26] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[27] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[28] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[29] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 5, sizeY * 2, sizeX, sizeY))).getImage());

			// mover Izquierda 5
			sprites[30] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[31] = new Sprite((new ImageIcon(im.getSubimage(sizeX, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[32] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[33] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[34] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[35] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 5, sizeY * 3, sizeX, sizeY))).getImage());

			// mover nada right 6
			sprites[36] = sprites[24];
			sprites[37] = sprites[24];
			sprites[38] = sprites[24];
			sprites[39] = sprites[24];
			sprites[40] = sprites[24];
			sprites[41] = sprites[24];

			// mover nada left 7
			sprites[42] = sprites[30];
			sprites[43] = sprites[30];
			sprites[44] = sprites[30];
			sprites[45] = sprites[30];
			sprites[46] = sprites[30];
			sprites[47] = sprites[30];

			// hacer crecer 8
			sprites[48] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[49] = new Sprite((new ImageIcon(im.getSubimage(sizeX, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[50] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[51] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[52] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[53] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 5, sizeY * 4, sizeX, sizeY))).getImage());

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		/*
		 * los parametros indican que tiene 3 sprites por cada movimiento posible, tiene 5
		 * movimientos posibles y tiene un retardo de 10 entre cada cambio de sprite
		 */
		aniMarioGrande = new SpriteMovementsPrioridad(sprites, 6, 7, 7);
	}

	/* Carga desde archivo todos las imagenes del mario */
	private void cargarSpriteMovementsMarioGrandeFlor(String nameImgMarioGrandeFlor) {
		Sprite[] sprites = new Sprite[54];
		int sizeX = Constantes.sizeMarioGrandeX;
		int sizeY = Constantes.sizeMarioGrandeY;

		try {
			BufferedImage im = ImageIO.read(getClass().getResourceAsStream(nameImgMarioGrandeFlor));

			// Saltar Izquierda Subida 0
			sprites[0] = new Sprite((new ImageIcon(im.getSubimage(0, 0, sizeX, sizeY))).getImage());
			sprites[1] = sprites[0];
			sprites[2] = sprites[0];
			sprites[3] = sprites[0];
			sprites[4] = sprites[0];
			sprites[5] = sprites[0];

			// Saltar Izquierda bajada 1
			sprites[6] = new Sprite((new ImageIcon(im.getSubimage(sizeX, 0, sizeX, sizeY))).getImage());
			sprites[7] = sprites[6];
			sprites[8] = sprites[6];
			sprites[9] = sprites[6];
			sprites[10] = sprites[6];
			sprites[11] = sprites[6];

			// Saltar Derecha subida 2

			sprites[12] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY, sizeX, sizeY))).getImage());
			sprites[13] = sprites[12];
			sprites[14] = sprites[12];
			sprites[15] = sprites[12];
			sprites[16] = sprites[12];
			sprites[17] = sprites[12];

			// Saltar Derecha bajada 3

			sprites[18] = new Sprite((new ImageIcon(im.getSubimage(sizeX, sizeY, sizeX, sizeY))).getImage());
			sprites[19] = sprites[18];
			sprites[20] = sprites[18];
			sprites[21] = sprites[18];
			sprites[22] = sprites[18];
			sprites[23] = sprites[18];

			// mover derecha 4
			sprites[24] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[25] = new Sprite((new ImageIcon(im.getSubimage(sizeX, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[26] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[27] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[28] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[29] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 5, sizeY * 2, sizeX, sizeY))).getImage());

			// mover Izquierda 5
			sprites[30] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[31] = new Sprite((new ImageIcon(im.getSubimage(sizeX, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[32] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[33] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[34] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[35] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 5, sizeY * 3, sizeX, sizeY))).getImage());

			// mover nada right 6
			sprites[36] = sprites[24];
			sprites[37] = sprites[24];
			sprites[38] = sprites[24];
			sprites[39] = sprites[24];
			sprites[40] = sprites[24];
			sprites[41] = sprites[24];

			// mover nada left 7
			sprites[42] = sprites[30];
			sprites[43] = sprites[30];
			sprites[44] = sprites[30];
			sprites[45] = sprites[30];
			sprites[46] = sprites[30];
			sprites[47] = sprites[30];

			// hacer crecer 8
			sprites[48] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[49] = new Sprite((new ImageIcon(im.getSubimage(sizeX, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[50] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[51] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[52] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[53] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 5, sizeY * 4, sizeX, sizeY))).getImage());

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		/*
		 * los parametros indican que tiene 3 sprites por cada movimiento posible, tiene 5
		 * movimientos posibles y tiene un retardo de 10 entre cada cambio de sprite
		 */
		aniMarioGrandeFlor = new SpriteMovementsPrioridad(sprites, 6, 7, 7);
	}

	private void cargarSpriteMovementsGoomba(String nameImgGoomba) {
		Sprite[] sprites = new Sprite[6];
		int size = Constantes.sizeEnemigos;

		try {
			BufferedImage im = ImageIO.read(getClass().getResourceAsStream(nameImgGoomba));
			// mover derecha
			sprites[0] = new Sprite((new ImageIcon(im.getSubimage(0, 0, size, size))).getImage());
			sprites[1] = new Sprite((new ImageIcon(im.getSubimage(size * 1, 0, size, size))).getImage());
			sprites[2] = new Sprite((new ImageIcon(im.getSubimage(size * 2, 0, size, size))).getImage());

			// mover izquierda
			sprites[3] = new Sprite((new ImageIcon(im.getSubimage(0, size, size, size))).getImage());
			sprites[4] = new Sprite((new ImageIcon(im.getSubimage(size * 1, size, size, size))).getImage());
			sprites[5] = new Sprite((new ImageIcon(im.getSubimage(size * 2, size, size, size))).getImage());

			aniGoomba = new SpriteMovements(sprites, 3, 2, 20);

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private void cargarSpriteMovementsKoopa(String nameImgKoopa) {
		Sprite[] sprites = new Sprite[20];
		int sizeX = Constantes.sizeKoopaX;
		int sizeY = Constantes.sizeKoopaY;

		try {
			BufferedImage im = ImageIO.read(getClass().getResourceAsStream(nameImgKoopa));
			// move 0 : mover izquierda normal
			sprites[0] = new Sprite((new ImageIcon(im.getSubimage(0, 0, sizeX, sizeY))).getImage());
			sprites[1] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 1, 0, sizeX, sizeY))).getImage());
			sprites[2] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, 0, sizeX, sizeY))).getImage());
			sprites[3] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, 0, sizeX, sizeY))).getImage());
			sprites[4] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, 0, sizeX, sizeY))).getImage());

			// move 1 : mover derecha normal
			sprites[5] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY, sizeX, sizeY))).getImage());
			sprites[6] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 1, sizeY, sizeX, sizeY))).getImage());
			sprites[7] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY, sizeX, sizeY))).getImage());
			sprites[8] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY, sizeX, sizeY))).getImage());
			sprites[9] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY, sizeX, sizeY))).getImage());

			// move 2 : mover izquierda furioso
			sprites[10] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[11] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 1, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[12] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[13] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[14] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY * 2, sizeX, sizeY))).getImage());

			// move 3 : mover derecha furioso
			sprites[15] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[16] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 1, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[17] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[18] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[19] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY * 3, sizeX, sizeY))).getImage());

			aniKoopa = new SpriteMovements(sprites, 5, 4, 20);

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private void cargarSpriteMovementsMonkey(String nameImgMonkey) {
		Sprite[] sprites = new Sprite[30];
		int sizeX = Constantes.sizeMonkeyX;
		int sizeY = Constantes.sizeMonkeyY;

		try {
			BufferedImage im = ImageIO.read(getClass().getResourceAsStream(nameImgMonkey));
			// move 0 : mover izquierda normal
			sprites[0] = new Sprite((new ImageIcon(im.getSubimage(0, 0, sizeX, sizeY))).getImage());
			sprites[1] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 1, 0, sizeX, sizeY))).getImage());
			sprites[2] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, 0, sizeX, sizeY))).getImage());
			sprites[3] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, 0, sizeX, sizeY))).getImage());
			sprites[4] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, 0, sizeX, sizeY))).getImage());

			// move 1 : mover derecha normal
			sprites[5] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY, sizeX, sizeY))).getImage());
			sprites[6] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 1, sizeY, sizeX, sizeY))).getImage());
			sprites[7] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY, sizeX, sizeY))).getImage());
			sprites[8] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY, sizeX, sizeY))).getImage());
			sprites[9] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY, sizeX, sizeY))).getImage());

			// move 2 : mover izquierda furioso
			sprites[10] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[11] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 1, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[12] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[13] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY * 2, sizeX, sizeY))).getImage());
			sprites[14] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY * 2, sizeX, sizeY))).getImage());

			// move 3 : mover derecha furioso
			sprites[15] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[16] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 1, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[17] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[18] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY * 3, sizeX, sizeY))).getImage());
			sprites[19] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY * 3, sizeX, sizeY))).getImage());

			// move 4 : modo mortal sin traje
			sprites[20] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[21] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 1, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[22] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[23] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY * 4, sizeX, sizeY))).getImage());
			sprites[24] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY * 4, sizeX, sizeY))).getImage());

			// move 5 : modo mortal con traje
			sprites[25] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY * 5, sizeX, sizeY))).getImage());
			sprites[26] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 1, sizeY * 5, sizeX, sizeY))).getImage());
			sprites[27] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY * 5, sizeX, sizeY))).getImage());
			sprites[28] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY * 5, sizeX, sizeY))).getImage());
			sprites[29] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY * 5, sizeX, sizeY))).getImage());

			aniMonkey = new SpriteMovements(sprites, 5, 6, 20);

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private void cargarSpriteMovementsPowerUps(String nameImgPowerUps) {
		Sprite[] spritesHongoRojo = new Sprite[1];
		Sprite[] spritesHongoVerde = new Sprite[1];
		Sprite[] spritesBombaNuclear = new Sprite[1];
		Sprite[] spritesEstrella = new Sprite[1];
		Sprite[] spritesFlorFuego = new Sprite[1];
		int size = Constantes.sizeCelda;

		try {
			BufferedImage im = ImageIO.read(getClass().getResourceAsStream(nameImgPowerUps));
			// mover derecha
			spritesHongoRojo[0] = new Sprite((new ImageIcon(im.getSubimage(0, 0, size, size))).getImage());
			aniHongoRojo = new SpriteMovements(spritesHongoRojo, 1, 1, 20);

			spritesHongoVerde[0] = new Sprite((new ImageIcon(im.getSubimage(1 * size, 0, size, size))).getImage());
			aniHongoVerde = new SpriteMovements(spritesHongoVerde, 1, 1, 20);

			spritesBombaNuclear[0] = new Sprite((new ImageIcon(im.getSubimage(2 * size, 0, size, size))).getImage());
			aniBombaNuclear = new SpriteMovements(spritesBombaNuclear, 1, 1, 20);

			spritesEstrella[0] = new Sprite((new ImageIcon(im.getSubimage(3 * size, 0, size, size))).getImage());
			aniEstrella = new SpriteMovements(spritesEstrella, 1, 1, 20);

			spritesFlorFuego[0] = new Sprite((new ImageIcon(im.getSubimage(4 * size, 0, size, size))).getImage());
			aniFlorFuego = new SpriteMovements(spritesFlorFuego, 1, 1, 20);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private void cargarSpriteMovementsMonedas(String nameImgMonedas) {
		Sprite[] sprites = new Sprite[7];
		int sizeX = Constantes.sizeMonedasX;
		int sizeY = Constantes.sizeMonedasY;
		try {
			BufferedImage im = ImageIO.read(getClass().getResourceAsStream(nameImgMonedas));
			// mover derecha
			sprites[0] = new Sprite((new ImageIcon(im.getSubimage(0, 0, sizeX, sizeY))).getImage());
			sprites[1] = new Sprite((new ImageIcon(im.getSubimage(sizeX, 0, sizeX, sizeY))).getImage());
			sprites[2] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, 0, sizeX, sizeY))).getImage());
			sprites[3] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, 0, sizeX, sizeY))).getImage());
			sprites[4] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, 0, sizeX, sizeY))).getImage());
			sprites[5] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 5, 0, sizeX, sizeY))).getImage());
			sprites[6] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 6, 0, sizeX, sizeY))).getImage());
			aniMonedas = new SpriteMovementsPrioridad(sprites, 7, 1, 10);

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private void cargarSpriteMovementsProyectil(String nameImgProyectil) {
		Sprite[] sprites = new Sprite[14];
		int sizeX = Constantes.sizeProyectilX;
		int sizeY = Constantes.sizeProyectilY;
		try {
			BufferedImage im = ImageIO.read(getClass().getResourceAsStream(nameImgProyectil));
			// 0 mover derecha
			sprites[0] = new Sprite((new ImageIcon(im.getSubimage(0, 0, sizeX, sizeY))).getImage());
			sprites[1] = new Sprite((new ImageIcon(im.getSubimage(sizeX, 0, sizeX, sizeY))).getImage());
			sprites[2] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, 0, sizeX, sizeY))).getImage());
			sprites[3] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, 0, sizeX, sizeY))).getImage());
			sprites[4] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, 0, sizeX, sizeY))).getImage());
			sprites[5] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 5, 0, sizeX, sizeY))).getImage());
			sprites[6] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 6, 0, sizeX, sizeY))).getImage());
			
			// 1 mover izquierda
			sprites[7] = new Sprite((new ImageIcon(im.getSubimage(0, sizeY, sizeX, sizeY))).getImage());
			sprites[8] = new Sprite((new ImageIcon(im.getSubimage(sizeX, sizeY, sizeX, sizeY))).getImage());
			sprites[9] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 2, sizeY, sizeX, sizeY))).getImage());
			sprites[10] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 3, sizeY, sizeX, sizeY))).getImage());
			sprites[11] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 4, sizeY, sizeX, sizeY))).getImage());
			sprites[12] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 5, sizeY, sizeX, sizeY))).getImage());
			sprites[13] = new Sprite((new ImageIcon(im.getSubimage(sizeX * 6, sizeY, sizeX, sizeY))).getImage());
			
			
			aniProyectil = new SpriteMovements(sprites, 7, 2, 20);

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
